package main

import (
	"bufio"
	"bytes"
	utils "cmd-tools/common"
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

func main() {
	var val string

	// 获取管道值
	fileInfo, _ := os.Stdin.Stat()
	if (fileInfo.Mode() & os.ModeNamedPipe) == os.ModeNamedPipe {
		s := bufio.NewScanner(os.Stdin)
		for s.Scan() {
			val += s.Text()
		}
	}

	// 获取参数值
	if val == "" {
		myArgs := new(utils.MyArgs)
		val = myArgs.GetByIndex(1, "")
	}

	if val == "" {
		fmt.Println(`
本命令将json字符串格式化输出
可在本命令后直接输入json串，或将json串保存为文件，再通过｜管道命令输入给本命令
用管道的目的的避免json串中有特殊字符，不能直接输入
管道和参数同时存在输入时，管道优先
		`)
		return
	}

	var jsonStr bytes.Buffer
	if err := json.Indent(&jsonStr, []byte(val), "", "  "); err == nil {
		fmt.Println(jsonStr.String())
	} else if strings.Contains(err.Error(), "{") {
		var n = -1
		var startIndex = 0
		for i, v := range val {
			if v == 123 {
				if n == -1 {
					n = 1
				} else {
					n++
				}
			}
			if v == 125 {
				n--
			}
			if n == 0 {
				_jsonStr := val[startIndex : i+1]
				fmt.Printf("从输入中获取到{}完整的JSON:[%d,%d]: \n %s\n", startIndex, i+1, _jsonStr)
				startIndex = i + 1
			}
		}
		if len(val) != startIndex {
			fmt.Printf("从输入中获取到{}不完整的JSON[%d,%d]: \n %s\n", startIndex, len(val), val[startIndex:])
		}
	} else {
		fmt.Println("输入异常：", err)
	}

}
